home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.5 Applications 2004 May / SGI IRIX 6.5 Applications 2004 May.iso / dist / java3d.idb / usr / demos / java / j3d / programs / examples / AlternateAppearance / AlternateAppearanceScopeTest.java.z / AlternateAppearanceScopeTest.java
Encoding:
Java Source  |  2003-08-08  |  10.7 KB  |  350 lines

  1. /*
  2.  *    @(#)AlternateAppearanceScopeTest.java 1.12 02/10/21 13:34:31
  3.  *
  4.  * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * - Redistribution in binary form must reproduce the above copyright
  14.  *   notice, this list of conditions and the following disclaimer in
  15.  *   the documentation and/or other materials provided with the
  16.  *   distribution.
  17.  *
  18.  * Neither the name of Sun Microsystems, Inc. or the names of
  19.  * contributors may be used to endorse or promote products derived
  20.  * from this software without specific prior written permission.
  21.  *
  22.  * This software is provided "AS IS," without a warranty of any
  23.  * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
  24.  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
  25.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
  26.  * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
  27.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  28.  * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
  29.  * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
  30.  * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
  31.  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
  32.  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
  33.  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  34.  *
  35.  * You acknowledge that Software is not designed,licensed or intended
  36.  * for use in the design, construction, operation or maintenance of
  37.  * any nuclear facility.
  38.  */
  39.  
  40. import java.applet.Applet;
  41. import java.awt.*;
  42. import java.awt.event.*;
  43. import com.sun.j3d.utils.applet.MainFrame;
  44. import com.sun.j3d.utils.geometry.*;
  45. import com.sun.j3d.utils.universe.*;
  46. import javax.media.j3d.*;
  47. import javax.vecmath.*;
  48. import javax.swing.*;
  49. import javax.swing.event.*;
  50. import javax.swing.border.*;
  51. import com.sun.j3d.utils.behaviors.vp.*;
  52.  
  53. public class AlternateAppearanceScopeTest extends JApplet 
  54. implements ActionListener {
  55.  
  56.  
  57.     Material mat1, altMat;               
  58.     Appearance app, otherApp;               
  59.     JComboBox altAppMaterialColor;
  60.     JComboBox appMaterialColor;
  61.     JComboBox altAppScoping;
  62.     JComboBox override;
  63.     private Group content1 = null;
  64.     private Group content2 = null;
  65.     BoundingSphere worldBounds;
  66.     AlternateAppearance altApp;
  67.     Shape3D[] shapes1, shapes2;
  68.     boolean shape1Enabled = false, shape2Enabled = false;
  69.     // Globally used colors
  70.    Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
  71.    Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
  72.    Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
  73.    Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);
  74.    Color3f[] colors = {white, red, green, blue};
  75.  
  76.     private SimpleUniverse u;
  77.     
  78.     public AlternateAppearanceScopeTest() {
  79.     }
  80.  
  81.     public void init() {
  82.     Container contentPane = getContentPane();
  83.     
  84.         Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
  85.         contentPane.add("Center", c);
  86.  
  87.         BranchGroup scene = createSceneGraph();
  88.         // SimpleUniverse is a Convenience Utility class
  89.     u = new SimpleUniverse(c);
  90.  
  91.     // add mouse behaviors to the viewingPlatform
  92.     ViewingPlatform viewingPlatform = u.getViewingPlatform();
  93.  
  94.         // This will move the ViewPlatform back a bit so the
  95.         // objects in the scene can be viewed.
  96.         viewingPlatform.setNominalViewingTransform();
  97.  
  98.     OrbitBehavior orbit = new OrbitBehavior(c,
  99.                         OrbitBehavior.REVERSE_ALL);
  100.     BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
  101.                            100.0);
  102.     orbit.setSchedulingBounds(bounds);
  103.     viewingPlatform.setViewPlatformBehavior(orbit);
  104.     
  105.         u.addBranchGraph(scene);
  106.  
  107.  
  108.     // Create GUI
  109.     JPanel p = new JPanel();
  110.     BoxLayout boxlayout = new BoxLayout(p, 
  111.                         BoxLayout.Y_AXIS);
  112.     p.add(createScopingPanel());
  113.     p.add(createMaterialPanel());
  114.     p.setLayout(boxlayout);
  115.     
  116.     contentPane.add("South", p);
  117.     }
  118.  
  119.     public void destroy() {
  120.     u.cleanup();
  121.     }
  122.     
  123.     BranchGroup createSceneGraph() {
  124.     BranchGroup objRoot = new BranchGroup();
  125.  
  126.     // Create influencing bounds
  127.     worldBounds = new BoundingSphere(
  128.                         new Point3d( 0.0, 0.0, 0.0 ),  // Center
  129.                         1000.0 );                      // Extent
  130.  
  131.     Transform3D t = new Transform3D();
  132.     // move the object upwards
  133.     t.set(new Vector3f(0.0f, 0.1f, 0.0f));
  134.     // Shrink the object 
  135.     t.setScale(0.8);
  136.  
  137.     TransformGroup trans = new TransformGroup(t);
  138.     trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  139.     trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  140.  
  141.  
  142.     otherApp = new Appearance();
  143.     altMat = new Material();
  144.     altMat.setCapability(Material.ALLOW_COMPONENT_WRITE);
  145.     altMat.setDiffuseColor( new Color3f( 0.0f, 1.0f, 0.0f ) );
  146.     otherApp.setMaterial(altMat);
  147.  
  148.     altApp = new AlternateAppearance();
  149.     altApp.setAppearance(otherApp);
  150.     altApp.setCapability(AlternateAppearance.ALLOW_SCOPE_WRITE);
  151.     altApp.setCapability(AlternateAppearance.ALLOW_SCOPE_READ);
  152.     altApp.setInfluencingBounds( worldBounds );
  153.     objRoot.addChild(altApp);
  154.     
  155.     // Build foreground geometry into two groups.  We'll
  156.     // create three directional lights below, one each with
  157.     // scope to cover the first geometry group only, the
  158.     // second geometry group only, or both geometry groups.
  159.     Appearance app1 = new Appearance();
  160.     mat1 = new Material();
  161.     mat1.setCapability(Material.ALLOW_COMPONENT_WRITE);
  162.     mat1.setDiffuseColor( new Color3f( 1.0f, 0.0f, 0.0f ) );
  163.     app1.setMaterial(mat1);
  164.     content1 = new SphereGroup(
  165.                    0.05f,   // radius of spheres
  166.                    0.4f,    // x spacing
  167.                    0.2f,   // y spacing
  168.                    3,       // number of spheres in X
  169.                    5,       // number of spheres in Y
  170.                    app1, // appearance
  171.                    true);  // alt app override = true
  172.     trans.addChild( content1 );
  173.     shapes1 = ((SphereGroup)content1).getShapes();
  174.     
  175.     content2 = new SphereGroup(
  176.                    0.05f,   // radius of spheres
  177.                    .4f,    // x spacing
  178.                    0.2f,   // y spacing
  179.                    2,       // number of spheres in X
  180.                    5,       // number of spheres in Y
  181.                    app1,   // appearance
  182.                    true); // alt app override = true
  183.     trans.addChild( content2 );    
  184.     shapes2 = ((SphereGroup)content2).getShapes();
  185.  
  186.  
  187.     // Add lights
  188.     DirectionalLight light1 = null;
  189.     light1 = new DirectionalLight( );
  190.     light1.setEnable( true );
  191.     light1.setColor( new Color3f(0.2f, 0.2f, 0.2f) );
  192.     light1.setDirection( new Vector3f( 1.0f, 0.0f, -1.0f ) );
  193.     light1.setInfluencingBounds( worldBounds );
  194.     objRoot.addChild( light1 );
  195.  
  196.      DirectionalLight light2 = new DirectionalLight();
  197.      light2.setEnable(true);
  198.      light2.setColor(new Color3f(0.2f, 0.2f, 0.2f));
  199.      light2.setDirection(new Vector3f(-1.0f, 0.0f, 1.0f));
  200.      light2.setInfluencingBounds(worldBounds);
  201.      objRoot.addChild(light2);
  202.  
  203.     // Add an ambient light to dimly illuminate the rest of
  204.     // the shapes in the scene to help illustrate that the
  205.     // directional lights are being scoped... otherwise it looks
  206.     // like we're just removing shapes from the scene
  207.     AmbientLight ambient = new AmbientLight( );
  208.     ambient.setEnable( true );
  209.     ambient.setColor( new Color3f(1.0f, 1.0f, 1.0f) );
  210.     ambient.setInfluencingBounds( worldBounds );
  211.     objRoot.addChild( ambient );
  212.         
  213.  
  214.     objRoot.addChild(trans);
  215.  
  216.     return objRoot;
  217.     }
  218.     JPanel createScopingPanel() {
  219.     JPanel panel = new JPanel();
  220.     panel.setBorder(new TitledBorder("Scopes"));
  221.  
  222.     String values[] = {"Scoped Set1", "Scoped Set2", "Universal Scope"};
  223.     altAppScoping = new JComboBox(values);
  224.     altAppScoping.addActionListener(this);
  225.     altAppScoping.setSelectedIndex(2);
  226.     panel.add(new JLabel("Scoping"));     
  227.     panel.add(altAppScoping);
  228.  
  229.  
  230.     String enables[] = { "Enabled Set1", "Enabled Set2", "Enabled set1&2", "Disabled set1&2"};
  231.  
  232.     override = new JComboBox(enables);
  233.     override.addActionListener(this);
  234.     override.setSelectedIndex(3);
  235.     panel.add(new JLabel("Alternate Appearance Override"));     
  236.     panel.add(override);
  237.  
  238.     return panel;
  239.  
  240.     }
  241.  
  242.     JPanel createMaterialPanel() {
  243.     JPanel panel = new JPanel();
  244.     panel.setBorder(new TitledBorder("Appearance Attributes"));
  245.  
  246.     String colorVals[] = { "WHITE", "RED", "GREEN", "BLUE"};
  247.  
  248.     altAppMaterialColor = new JComboBox(colorVals);
  249.     altAppMaterialColor.addActionListener(this);
  250.     altAppMaterialColor.setSelectedIndex(2);
  251.     panel.add(new JLabel("Alternate Appearance MaterialColor"));     
  252.     panel.add(altAppMaterialColor);
  253.     
  254.  
  255.  
  256.     appMaterialColor = new JComboBox(colorVals);
  257.     appMaterialColor.addActionListener(this);
  258.     appMaterialColor.setSelectedIndex(1);
  259.     panel.add(new JLabel("Normal Appearance MaterialColor"));     
  260.     panel.add(appMaterialColor);
  261.     
  262.     return panel;
  263.  
  264.  
  265.     }
  266.  
  267.     public void actionPerformed(ActionEvent e) {
  268.     Object target = e.getSource();
  269.     if (target == altAppMaterialColor) {
  270.         altMat.setDiffuseColor(colors[altAppMaterialColor.getSelectedIndex()]);
  271.     }
  272.     else if (target == altAppScoping) {
  273.         for (int i = 0; i < altApp.numScopes(); i++) {
  274.         altApp.removeScope(0);
  275.         }
  276.         if (altAppScoping.getSelectedIndex() == 0) {
  277.         altApp.addScope(content1);
  278.         }
  279.         else if (altAppScoping.getSelectedIndex() == 1) {
  280.         altApp.addScope(content2);
  281.         }
  282.     }
  283.     else if (target == override) {
  284.         int i;
  285.         if (override.getSelectedIndex()== 0) {
  286.         if (!shape1Enabled) {
  287.             for (i = 0; i < shapes1.length; i++)
  288.             shapes1[i].setAppearanceOverrideEnable(true);
  289.             shape1Enabled = true;
  290.         }
  291.  
  292.         if (shape2Enabled) {
  293.             for (i = 0; i < shapes2.length; i++)
  294.             shapes2[i].setAppearanceOverrideEnable(false);
  295.             shape2Enabled = false;
  296.         }
  297.         }
  298.         else if (override.getSelectedIndex() == 1) {
  299.         if (!shape2Enabled) {
  300.             for (i = 0; i < shapes2.length; i++)
  301.             shapes2[i].setAppearanceOverrideEnable(true);
  302.             shape2Enabled = true;
  303.         }
  304.  
  305.         if (shape1Enabled) {
  306.             for (i = 0; i < shapes1.length; i++)
  307.             shapes1[i].setAppearanceOverrideEnable(false);
  308.             shape1Enabled = false;
  309.         }
  310.         }
  311.         else if (override.getSelectedIndex() == 2) {
  312.         if (!shape1Enabled) {
  313.             for (i = 0; i < shapes1.length; i++)
  314.             shapes1[i].setAppearanceOverrideEnable(true);
  315.             shape1Enabled = true;
  316.         }
  317.         if (!shape2Enabled) {
  318.             for (i = 0; i < shapes2.length; i++)
  319.             shapes2[i].setAppearanceOverrideEnable(true);
  320.             shape2Enabled = true;
  321.         }
  322.         }
  323.         else {
  324.         if (shape1Enabled) {
  325.             for (i = 0; i < shapes1.length; i++)
  326.             shapes1[i].setAppearanceOverrideEnable(false);
  327.             shape1Enabled = false;
  328.         }
  329.             
  330.         if (shape2Enabled) {
  331.             for (i = 0; i < shapes2.length; i++)
  332.             shapes2[i].setAppearanceOverrideEnable(false);
  333.             shape2Enabled = false;
  334.         }
  335.         }
  336.         
  337.     }
  338.     else if (target == appMaterialColor) {
  339.         mat1.setDiffuseColor(colors[appMaterialColor.getSelectedIndex()]);
  340.     }
  341.  
  342.     }
  343.                
  344.                
  345.     public static void main(String[] args) {
  346.     Frame frame = new MainFrame(new AlternateAppearanceScopeTest(), 800, 800);
  347.     }
  348.  
  349. }               
  350.